package com.study.spmongodb.thread;

/**
 * @author study
 * @version 1.0
 * @date 2020/10/13 16:04
 */
public class Demo1Jmm02 {
    public static void main(String[] args) throws InterruptedException {

        final JmmDemo jmmDemo = new JmmDemo();
        new Thread(jmmDemo).start();
        Thread.sleep(1000);
        jmmDemo.flag = false;
        System.out.println("已经修改为false");
        //线程之间的变量是不可见的恶，因为读取的都是副本，没有及时读取到主内存的结果
        System.out.println(jmmDemo.flag);
    }

    static class JmmDemo implements Runnable {
        // public  boolean flag = true;

        //线程可见性
        public boolean flag = true;

        @Override
        public void run() {
            System.out.println("子线程执行");
            while (flag) {
                //同步代码块释放锁的时候，会把所有值刷新到主内存中

                //同步代码块在加锁时候，会从主内存中获取最新的变量。
                synchronized (this) {
                }
            }
            System.out.println("子线程结束");
        }
    }
}
